If you try to print (or show) .WMF-Files with Visual BASIC, you may run into the same problem as I did: I was not able to use some COREL-Draw Metafiles in Visual BASIC. The problem is that .WMF is not .WMF for all files. Some .WMF-Files are true Windows-Metafiles which can be used without any error, but most of the Files are in the ALDUS-PLACEABLE-METAFILE-Format (APM). I found a description about the problem in the new WIN SDK 3.1-Doc. It is listed below. Several months ago, I wrote a small DLL to use the APM-Files. There was an article in the Microsoft-Systems-Journal which had included a sample program. My extensions to that are the following: 1. I use a huge pointer to read the Metafile. Because of that I am able to read Metafiles larger than 64 kBytes 2. There is a function CreateMemhDC which creates a compatible Bitmap for a given Device-Context in memory (thanks to Charles Petzold's 'Programming Windows'). I "play the metafile into that Bitmap". The reason to do this is that you can simply copy the created Bitmap to your device via BITBLT. The Bitmap in memory has all the properties of the device, so you really 'draw on the device'. 3. The third function (CopyMemToDev) copies the memory Bitmap to the device. Try it with a big .WMF-File. (My example was a file with 196000 Bytes, a 20 MHz 386SX needs around 10 seconds to create the Bitmap in memory. But you can copy this Bitmap 10 times to the printer in 5 seconds.) 4. ClearMemhDC deletes the created Bitmap. Please find the DLL with the source and an example written in VisualBasic in this arcive. You may use the sources without any royalties. I'm not sure if the DLL handles ALL possible errors. Feel free to contact me at 100042,47. ********************* WINDOWS 3.1 DOC (courtesy of Microsoft) ************ Using Windows Metafile Functions and Aldus Placeable Metafiles Summary Many Windows applications import or export Windows metafiles in a format known as the Aldus Placeable Metafile (APM) format. In this format, these metafiles cannot be used with the Windows metafile functions such as GetMetaFile, CopyMetaFile, PlayMetaFile, and so on. To use these metafiles, the APM header must be removed from the metafile and the remaining metafile bits must be written to a newly created metafile. More Information The APM header is 22 bytes in length and is defined as follows: typedef struct { DWORD key; HANDLE hmf; RECT bbox; WORD inch; DWORD reserved; WORD checksum; } APMFILEHEADER; The following code fragment demonstrates how to create a memory-based Windows metafile from an Aldus Placeable Metafile that will work with the metafile functions provided by Windows. For more information regarding the APM format, call the Aldus Developer's Desk at (206) 622-5500 (ask for the third-party developer's desk). This number is correct as of 1/31/92. Please contact Aldus for its latest policy on distribution of information about the APM format. BOOL RenderAPM (fh) int fh; // a file handle to the APM metafile is passed in { HANDLE hData; LPSTR lpData; DWORD OffsetToMeta; METAHEADER mfHeader; APMFILEHEADER APMHeader; OffsetToMeta = sizeof(APMHeader); // Seek to beginning of file and read APM header _llseek(fh, 0, 0); if (!_lread(fh, (LPSTR)&APMHeader, sizeof(APMFILEHEADER))) // Error in reading the file return(FALSE); // Return to read metafile header _llseek(fh, OffsetToMeta, 0); if (!_lread(fh, (LPSTR)&mfHeader, sizeof(METAHEADER))) // Error in reading return(FALSE); // Allocate memory for memory based metafile if (!(hData = GlobalAlloc(GHND, (mfHeader.mtSize * 2L)))) return(FALSE); // Were we successful? if (!(lpData = GlobalLock(hData))) { // Error in allocation GlobalFree(hData); return(FALSE); } // Read metafile bits _llseek(fh, OffsetToMeta, 0); if (!_lread(fh, lpData, (mfHeader.mtSize * 2L))) { // Error in reading GlobalUnlock(hData); GlobalFree(hData); return(FALSE); } // Create the METAFILE with the bits we read in. if (!(hMF = SetMetaFileBits(hData))) return(FALSE); GlobalUnlock(hData); // Close the APM file _lclose(fh); // Return success return(TRUE); }